package com.hw.graphql.scalartype;

import graphql.schema.*;
import lombok.SneakyThrows;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @program: spring-graphql
 * @description:
 *  1.name: 字段名，请保持与schema中定的标量类型名称保持一致
 *  2.description: 类型描述，在一些诊断工具上还是很有用的
 *  3.serialize: 序列化函数，用于将结果转换为适合 http 传输的数值类型
 *  4.parseValue: 解析函数，用于将客户端通过 variables 参数传递的数值为 Date 类型
 *  5.parseLiteral: 同样是解析函数，将客户端传递的字面量参数解析为 Date 类型
 * @author: hewei
 * @date: 2021-11-30 13:43
 **/
@Configuration
class CustomScalarType  {

    private static final SimpleDateFormat dtf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Bean
    public GraphQLScalarType GraphqlDateTime(){
        return GraphQLScalarType.newScalar()
                .name("DateTime")
                .description("graphql 的DateTime类型")
                .coercing(new Coercing<Date,String>() {

                    /*日期类型解析为字符串*/
                    @Override
                    public String serialize(Object o) throws CoercingSerializeException {
                        Date dateTime=(Date) o;
                        return dtf.format(dateTime);
                    }

                    /*解析 variables 参数中的时间*/
                    @SneakyThrows
                    @Override
                    public Date parseValue(Object o) throws CoercingParseValueException {
                        String dateTime=String.valueOf(o);
                        return dtf.parse(dateTime);
                    }

                    /*解析 query中字面量参数时间*/
                    @SneakyThrows
                    @Override
                    public Date parseLiteral(Object o) throws CoercingParseLiteralException {
                        String dateTime=String.valueOf(o);
                        if ("null".equalsIgnoreCase(dateTime) || "".equalsIgnoreCase(dateTime)) {
                            return null;
                        }
                        return dtf.parse(dateTime);
                    }
                })
                .build();
    }

}
